package com.gitee.huanminabc.dynamicdb.core;

import lombok.extern.slf4j.Slf4j;
import org.springframework.jdbc.datasource.DataSourceTransactionManager;
import org.springframework.transaction.TransactionStatus;

import java.util.Stack;
/**
 * @author huanmin
 * @date 2024/11/22
 */
@Slf4j
public class DBContext {

    //======================事务

    public static final ThreadLocal<Stack<TransactionStatus>> stack = new InheritableThreadLocal<>();
    public static final ThreadLocal<Stack<DataSourceTransactionManager>> transaction = new InheritableThreadLocal<>();
    //记录事务嵌套的层数 主要解决嵌套事务的的问题
    public static final ThreadLocal<Long> deepTransaction= new InheritableThreadLocal<>();

    //=====================数据源切换
    public static final ThreadLocal<String> dbKeys = new InheritableThreadLocal<>();

    //======================多租户
    public static final ThreadLocal<String> tenantKeys = new InheritableThreadLocal<>();


    //线程结束的时候清理全部的资源
    public static void clear() {
        // 解决单元测试的问题, 他实际不是在main线程中执行的代码, 初始化阶段是在main线程中执行的, 然后会关闭main线程
        // 之后会开启新的线程执行代码 这就导致了, 因为不是继承的关系新的线程没有继承到main数据, 导致调试的时候找不到数据源
        String name = Thread.currentThread().getName();
        if (name.equals("main")) {
            return;
        }

        //数据源
        dbKeys.remove();
        //租户
        tenantKeys.remove();

        //事务
        stack.remove();
        transaction.remove();
        deepTransaction.remove();
        log.info("clear数据源线程数据清理完成{}", Thread.currentThread().getName());
    }
}
